{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 10.3变分线性回归"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "<center>\n",
    "    <img src=\"../10_8.png\" width=\"200\" height=\"200\">\n",
    "</center>\n",
    "\n",
    "在第3章讨论的线性回归中，w的似然函数为\n",
    "$$p(t|w)=\\sum_{n=1}^N\\mathcal N(t_n|w^T\\phi_n,\\beta^{-1})$$\n",
    "先验概率分布为$$p(w|\\alpha)=\\mathcal N(w|0,\\alpha^{-1}I)$$"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "现在引入参数$\\alpha$的先验概率分布，即均值已知，方差未知服从Gamma分布$$p(\\alpha)=Gam(\\alpha|\\alpha_0,b_0)$$\n",
    "则联合概率分布可以写成$$p(t,w,\\alpha)=p(t|w)p(w|\\alpha)p(\\alpha)$$\n",
    "为了寻找后验概率分布$p(w,\\alpha|t)$的近似分布，分解变分后验概率分布:$$q(w,\\alpha)=q(w)q(\\alpha)$$"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "由变分框架可得:\n",
    "$$\\begin{align}lnq^*(\\alpha)&=lnp(\\alpha)+\\mathbb E_w[lnp(w|\\alpha)]+const\\\\&=(\\alpha_0-1)ln\\alpha-b_0\\alpha+\\frac{M}{2}ln\\alpha-\\frac{\\alpha}{2}\\mathbb E[w^Tw]+const\\end{align}$$\n",
    "\n",
    "$$\\begin{align}lnq^*(w)&=lnp(t|w)+\\mathbb E_{\\alpha}[lnp(w|\\alpha)]+const\\\\&=-\\frac{\\beta}{2}\\sum_{n=1}^N\\{w^T\\phi_n-t_n\\}^2-\\frac{1}{2}\\mathbb E[\\alpha]w^Tw+const\\\\&=-\\frac{1}{2}w^T(\\mathbb E[\\alpha]I+\\beta\\Phi^T\\Phi)w+\\beta w^T\\Phi^Tt+const\\end{align}$$"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "可以发现\n",
    "$$ q^*(\\alpha)=Gam(\\alpha|a_N,b_N)$$\n",
    "$$q^*(w)=\\mathcal N(w|m_N,S_N)$$"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "更新规则 \n",
    "* 计算$\\alpha$,其中$\\alpha_N=\\alpha_0+\\frac{M}{2}$,每次更新该值固定\n",
    "* 计算$E[\\alpha]=\\frac{a_N}{b_N}$\n",
    "\n",
    "  更新$S_N=(\\mathbb E[\\alpha]I+\\beta\\Phi^T\\Phi)^{-1}$\n",
    "  \n",
    "  更新$m_N=\\beta S_N\\Phi^Tt$\n",
    "  \n",
    "  \n",
    "* 计算$E[w^Tw]=m_Nm_N^T+S_N$\n",
    "  \n",
    "  更新$b_N=b_0+\\frac{1}{2}\\mathbb E[w^Tw]$"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 预测分布"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "$$\\begin{align}p(t|\\mathbf x,\\mathbf t)&=\\int p(t|\\mathbf x,\\mathbf w)p(\\mathbf w|\\mathbf t)d\\mathbf w\\\\&=\\int p(t|\\mathbf x,\\mathbf w)q(\\mathbf w)d \\mathbf w \\\\&=\\int\\mathcal N(t|\\mathbf w^T\\phi(x),\\beta^{-1}\\mathcal N(\\mathbf w|m_N,S_N)d \\mathbf w\\\\&=\\mathcal N(t|m_N^T\\phi(x),\\sigma^2(\\mathbf x))\\end{align}$$\n",
    "\n",
    "其中:\n",
    "$$\\sigma^2(x)=\\frac{1}{\\beta}+\\phi(x)^TS_N\\phi(x)$$"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1,
   "metadata": {},
   "outputs": [],
   "source": [
    "import sys\n",
    "#sys.path\n",
    "sys.path.append(\"../\")\n",
    "import matplotlib.animation as animation\n",
    "import matplotlib.pyplot as plt\n",
    "import numpy as np\n",
    "%matplotlib inline\n",
    "\n",
    "from prml.rv import VariationalGaussianMixture\n",
    "from prml.features import PolynomialFeatures\n",
    "from prml.linear import (\n",
    "    VariationalLinearRegressor,\n",
    "    VariationalLogisticRegressor\n",
    ")\n",
    "\n",
    "np.random.seed(666)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "metadata": {},
   "outputs": [],
   "source": [
    "def create_toy_data(func, sample_size, std, domain=[0, 1]):\n",
    "    x = np.linspace(domain[0], domain[1], sample_size)\n",
    "    np.random.shuffle(x)\n",
    "    t = func(x) + np.random.normal(scale=std, size=x.shape)\n",
    "    return x, t\n",
    "\n",
    "#3次立方插值\n",
    "def cubic(x):\n",
    "    return x * (x - 5) * (x + 5)\n",
    "\n",
    "x_train, y_train = create_toy_data(cubic, 10, 10., [-5, 5])\n",
    "x = np.linspace(-5, 5, 100)\n",
    "y = cubic(x)\n",
    "\n",
    "feature = PolynomialFeatures(degree=3)\n",
    "X_train = feature.transform(x_train)\n",
    "X = feature.transform(x)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<matplotlib.figure.Figure at 0x7f72d95ee780>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "vlr = VariationalLinearRegressor(beta=0.01)\n",
    "vlr.fit(X_train, y_train)\n",
    "y_mean, y_std = vlr.predict(X, return_std=True)\n",
    "plt.scatter(x_train, y_train, s=100, facecolor=\"none\", edgecolor=\"b\")\n",
    "plt.plot(x, y, c=\"g\", label=\"$\\sin(2\\pi x)$\")\n",
    "plt.plot(x, y_mean, c=\"r\", label=\"prediction\") \n",
    "plt.fill_between(x, y_mean - y_std, y_mean + y_std, alpha=0.5, color=\"pink\")\n",
    "plt.legend()\n",
    "plt.show()"
   ]
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.6.1"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 2
}
